/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "reportebebidas.h"

#include <QTextCharFormat>
#include <QTextBlockFormat>
#include <QTextTable>
#include <QTextTableFormat>
#include <QTextTableCell>
#include <QTextTableCellFormat>
#include <QSqlDatabase>
#include <QSqlRecord>
#include <QSqlQuery>
#include <QDate>

#include <QDebug>

ReporteBebidas::ReporteBebidas(QObject *parent) :
    QObject(parent),textoNormal(),textoCabecera()
{
    setup();
}

QTextDocument *ReporteBebidas::getReporte() const
{
    return this->reporte;
}

void ReporteBebidas::setup()
{
    this->reporte=0;
    this->cursor=0;
}

void ReporteBebidas::clean()
{
    if(this->reporte)
    {
        delete this->reporte;
        this->reporte=0;
    }
    if(cursor)
    {
        delete this->cursor;
        cursor=0;
    }

}

void ReporteBebidas::presentaDialog()
{
    DialogReport *dialog=new DialogReport(0);

    dialog->setDocument(this->reporte);

    dialog->exec();

    delete dialog;
}

void ReporteBebidas::writeDatosGenerales()
{
    QTextCharFormat formatoCabecera;
    QTextCharFormat formatoDatos;
    QFont fuenteCabecera("Arial",20,QFont::Bold,false);
    QString nombre,fechaInicio,fechaFin;

    fuenteCabecera.setCapitalization(QFont::Capitalize);

    formatoCabecera.setFont(fuenteCabecera);
    formatoDatos.setFont(fuenteCabecera);
    formatoDatos.setFontItalic(true);

    this->cursor->setCharFormat(formatoCabecera);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT nombreEvento,inicio,fin FROM evento");

        query.first();
        nombre=query.value(0).toString();
        fechaInicio=query.value(1).toDate().toString("dddd, dd 'de' MMMM 'de' yyyy");
        fechaFin=query.value(2).toDate().toString("dddd, dd 'de' MMMM 'de' yyyy");

    }

    cursor->setCharFormat(formatoDatos);
    cursor->insertText(nombre+"\n\n");
    formatoCabecera.setFontPointSize(18);
    formatoDatos.setFontPointSize(16);
    cursor->setCharFormat(formatoDatos);
    cursor->insertText(fechaInicio+" al "+fechaFin+"\n\n");
    cursor->insertBlock();
    cursor->insertBlock();
}

void ReporteBebidas::reportePorProductos()
{
    clean();
    preparaDocumento();
    writeDatosGenerales();

    writeListaProductos();
    writeListaProductosDetallada();
    presentaDialog();
}

void ReporteBebidas::preparaDocumento()
{
    if(reporte)
        delete reporte;
    if(cursor)
        delete cursor;

    reporte=new QTextDocument(this);
    cursor=new QTextCursor(reporte);

    textoNormal.setFont(QFont("Arial",12));
    textoCabecera.setFont(QFont("Arial",15,QFont::Bold,false));
}

void ReporteBebidas::writeListaProductos()
{
    QTextCharFormat encabezado=textoCabecera;
    QTextTable *tabla;
    QTextTableCell celda;
    float total=0;

    encabezado.setFontPointSize(17);


    cursor->insertText("Lista de productos",encabezado);
    tabla=cursor->insertTable(1,3);
    cursor->insertText("Producto",textoCabecera);
    cursor->movePosition(QTextCursor::NextCell);
    cursor->insertText("Vendidos",textoCabecera);
    cursor->movePosition(QTextCursor::NextCell);
    cursor->insertText("Total",textoCabecera);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT nombre,count(*),sum(precioVenta) FROM ventas GROUP BY nombre");

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString(),textoNormal);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString().append(" unidades"),textoNormal);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(2).toString().append(" euros"),textoNormal);
            total+=query.value(2).toFloat();
        }
    }
    tabla->appendRows(1);
    cursor->movePosition(QTextCursor::PreviousRow);
    cursor->movePosition(QTextCursor::NextCell);
    celda=tabla->cellAt(*cursor);

    tabla->mergeCells(celda.row(),celda.column(),1,tabla->columns()-1);
    cursor->insertText("TOTAL RECAUDADO: ",textoCabecera);
    cursor->movePosition(QTextCursor::NextCell);
    cursor->insertText(QString::number(total).append(" euros"),textoCabecera);
    cursor->movePosition(QTextCursor::End);
    cursor->insertBlock();
    cursor->insertBlock();
}

void ReporteBebidas::writeListaProductosDetallada()
{
    QTextCharFormat encabezado=textoCabecera;
    QTextTable *tabla;
    QTextTableCell celda;
    float total=0;
    int numTotal=0;
    int posicionOrigen;

    encabezado.setFontPointSize(17);

    cursor->insertText("Lista de productos detallada",encabezado);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));
        QSqlQuery aux(QSqlDatabase::database("evento"));

        query.exec("SELECT DISTINCT nombre FROM producto");
        aux.prepare("SELECT nombre,tipoVenta,precioVenta,count(*),sum(precioVenta) from ventas where nombre=:producto group by nombre,tipoVenta;");

        tabla=cursor->insertTable(1,5);

        query.first();
        do
        {

            aux.bindValue(":producto",query.value(0).toString());

            aux.exec();
            aux.first();
            cursor->insertText(query.value(0).toString(),textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            celda=tabla->cellAt(*cursor);
            tabla->mergeCells(celda.row(),celda.column(),1,2);
            cursor->insertText("Unidades",textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            celda=tabla->cellAt(*cursor);
            tabla->mergeCells(celda.row(),celda.column(),1,2);
            cursor->insertText("TOTAL",textoCabecera);
            tabla->appendRows(2);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            posicionOrigen=cursor->position();
            cursor->insertText(aux.value(1).toString().append(", ").append(aux.value(2).toString().append(" euros")),textoNormal);
            cursor->movePosition(QTextCursor::NextRow);
            numTotal+=aux.value(3).toInt();
            aux.next();
            numTotal+=aux.value(3).toInt();
            cursor->insertText(aux.value(1).toString().append(", ").append(aux.value(2).toString().append(" euros")),textoNormal);
            aux.previous();
            cursor->setPosition(posicionOrigen);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(aux.value(3).toString(),textoNormal);
            cursor->movePosition(QTextCursor::NextRow);
            cursor->movePosition(QTextCursor::NextCell);
            aux.next();
            cursor->insertText(aux.value(3).toString(),textoNormal);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::PreviousCell,QTextCursor::MoveAnchor,2);
            celda=tabla->cellAt(*cursor);
            tabla->mergeCells(celda.row(),celda.column(),2,1);
            cursor->insertText(QString::number(numTotal),textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            aux.first();
            cursor->insertText(aux.value(4).toString().append(" euros"),textoNormal);
            cursor->movePosition(QTextCursor::NextRow);
            cursor->movePosition(QTextCursor::NextCell,QTextCursor::MoveAnchor,2);
            aux.next();
            cursor->insertText(aux.value(4).toString().append(" euros"),textoNormal);
            aux.first();
            total+=aux.value(4).toFloat();
            aux.next();
            total+=aux.value(4).toFloat();
            cursor->movePosition(QTextCursor::NextCell);
            cursor->movePosition(QTextCursor::PreviousRow);
            celda=tabla->cellAt(*cursor);
            tabla->mergeCells(celda.row(),celda.column(),2,1);
            cursor->insertText(QString::number(total),textoCabecera);
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::NextRow,QTextCursor::MoveAnchor,3);
            total=0;
            numTotal=0;

        }while(query.next());

    }

}

void ReporteBebidas::reportePorVentas()
{
    clean();
    preparaDocumento();

    writeDatosGenerales();
    writeListaProductos();

    writeListaVentasPorDias();

    presentaDialog();
}

void ReporteBebidas::reportePalesAbiertos()
{
    clean();
    preparaDocumento();

    writeDatosGenerales();
    writeListaProductos();

    writeListaPalesAbiertos();

    presentaDialog();
}

void ReporteBebidas::writeListaVentasPorDias()
{
    QTextCharFormat encabezado=textoCabecera;
    QTextTableFormat formatoTabla;
    QTextTable *tabla;
    QTextTableCell celda;
    QDate inicio,fin;
    float total=0;

    encabezado.setFontPointSize(17);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT inicio,fin from evento");

        query.first();

        inicio=query.value(0).toDate();
        fin=query.value(1).toDate();

        query.clear();

        while(inicio<=fin)
        {

            QString sentencia="SELECT timestamp,nombre,tipoVenta,precioVenta from ventas where timestamp like %1";

            sentencia=sentencia.arg(inicio.toString("dd.MM.yyyy").prepend("'%").append("%'"));

            query.exec(sentencia);

            qDebug() << query.lastQuery();
            total=0;


            cursor->insertText(inicio.toString("dddd, dd 'd'e MMMM"),encabezado);

            tabla=cursor->insertTable(1,4);

            cursor->insertText("TIMESTAMP",textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText("PRODUCTO",textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText("TIPO VENTA",textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText("PRECIO",textoCabecera);

            while(query.next())
            {
                tabla->appendRows(1);
                cursor->movePosition(QTextCursor::PreviousRow);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(query.value(0).toString(),textoNormal);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(query.value(1).toString(),textoNormal);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(query.value(2).toString(),textoNormal);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(query.value(3).toString(),textoNormal);
                total+=query.value(3).toFloat();
            }

            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            celda=tabla->cellAt(*cursor);
            tabla->mergeCells(celda.row(),celda.column(),1,tabla->columns()-1);
            cursor->insertText("TOTAL VENDIDO",textoCabecera);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(QString::number(total),textoCabecera);

            cursor->movePosition(QTextCursor::End);

            cursor->insertBlock();
            cursor->insertBlock();


            qDebug() << inicio.toString("dd.MM.yyyy");
            inicio=inicio.addDays(1);

        }
    }
}

void ReporteBebidas::writeListaPalesAbiertos()
{
    QTextCharFormat encabezado=textoCabecera;
    QTextTableFormat formatoTabla;
    QTextTable *tabla;
    QTextTableCell celda;
    QDate inicio,fin;
    float total=0;

    encabezado.setFontPointSize(17);
    cursor->insertText("Lista de pales abiertos",encabezado);

    tabla=cursor->insertTable(1,2);
    cursor->insertText("PRODUCTO",textoCabecera);
    cursor->movePosition(QTextCursor::NextCell);
    cursor->insertText("PALES ABIERTOS",textoCabecera);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("select producto,count(*) from pales group by producto");

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString(),textoNormal);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString(),textoNormal);
        }
    }

    cursor->movePosition(QTextCursor::End);

    cursor->insertBlock();
    cursor->insertBlock();

    cursor->insertText("Lista detallada",encabezado);

    tabla=cursor->insertTable(1,2);

    cursor->insertText("FECHA",textoCabecera);
    cursor->movePosition(QTextCursor::NextCell);
    cursor->insertText("PRODUCTO",textoCabecera);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT timestamp,producto from pales order by timestamp asc");

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString(),textoNormal);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString(),textoNormal);
        }
    }

    cursor->movePosition(QTextCursor::End);
    cursor->insertBlock();
    cursor->insertBlock();
}
